// hdu3757
// 题意：给定n个士兵位置，m个避难所位置（一维位置），每个士兵都要去一个
//       避难所。每个避难所至少要有个士兵。士兵去一个避难所的费用是两者
//       的距离，问最小的费用是多少。
//
// 题解：dp。不过内存限制和输出方案非常烦。做的时候比较晕，wa了n次，最后
//       写了对拍和spj才过的。
//
// 统计：2121ms
//
// run: $exec < input
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <utility>

long long const inf = (long long)(1) << 60;
int const maxn = 4004;
std::pair<long long, int> a[maxn], b[maxn];
long long dp[2][maxn];
bool from[maxn][maxn];
short to[maxn];
int n, m;

template <class T>
T myabs(T const & a) { return (a >= 0 ? a : -a); }

void print()
{
	for (int i = n, j = m; i; i--) {
		to[a[i].second] = b[j].second;
		if (from[i][j]) j = j - 1;
	}
	std::printf("%d", to[1]);
	for (int i = 2; i <= n; i++)
		std::printf(" %d", to[i]);
	std::printf("\n");
}

int main()
{
	int T; std::scanf("%d", &T);
	while (T--) {
		std::scanf("%d", &n);
		for (int i = 1; i <= n; i++) {
			std::scanf("%lld", &a[i].first);
			a[i].second = i;
		}
		std::sort(a + 1, a + n + 1);
		std::scanf("%d", &m);
		for (int i = 1; i <= m; i++) {
			std::scanf("%lld", &b[i].first);
			b[i].second = i;
		}
		std::sort(b + 1, b + m + 1);

		for (int i = 1; i <= m; i++) dp[0][i] = inf;
		dp[0][0] = 0;
		int now = 0, prev = 0;
		for (int i = 1; i <= n; i++) {
			prev = now; now ^= 1;
			dp[now][0] = inf;
			for (int j = 1; j <= m; j++) {
				dp[now][j] = inf;
				long long ret = myabs(a[i].first - b[j].first);
				if (dp[prev][j - 1] < dp[prev][j]) {
					dp[now][j] = dp[prev][j - 1] + ret;
					from[i][j] = 1;
				} else {
					dp[now][j] = dp[prev][j] + ret;
					from[i][j] = 0;
				}
			}
		}

		std::printf("%lld\n", dp[now][m]);
		print();
	}
}

